package Objetos;

import com.sun.opengl.util.GLUT;
import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;

/**
 *
 */
public class Modelo {

//MEDIDAS CUERPO
    /*TORSO*/
    float ALTURA_TORSO = (float) 0.8;
    float ANCHO_TORSO = (float) (ALTURA_TORSO * 0.75);
    float TORSO = (float) (ANCHO_TORSO / 3.0);
    /*CABEZA*/
    float ALTURA_CABEZA = (float) (ALTURA_TORSO * 0.3);
    float TAMANHO_ARTICULACION_CABEZA = (float) (ALTURA_CABEZA / 6.0);
    float ANCHO_CABEZA = (float) (ALTURA_CABEZA * 0.93);
    /*BRAZOS Y MANOS*/
    float ALTURA_BRAZO_SUPERIOR = (float) (ALTURA_TORSO * 0.625);
    float TAMANHO_ARTICULACION_BRAZO_SUPERIOR = (float) (TAMANHO_ARTICULACION_CABEZA * 2.0);
    float ALTURA_BRAZO_INFERIOR = (float) (ALTURA_TORSO * 0.5);
    float TAMANHO_ARTICULACION_BRAZO_INFERIOR = (float) (TAMANHO_ARTICULACION_BRAZO_SUPERIOR * 0.75);
    float ANCHO_BRAZO_SUPERIOR = (float) (ANCHO_TORSO / 4.0);
    float ANCHO_BRAZO_INFERIOR = ANCHO_BRAZO_SUPERIOR;
    /*MANO*/
    float ANCHO_MANO = ANCHO_BRAZO_INFERIOR;
    float MANO = (float) (ANCHO_BRAZO_INFERIOR / 2.0);
    float ALTURA_MANO = (float) (ALTURA_BRAZO_INFERIOR / 2.0);
    float TAMANHO_DEDO = (float) 0.1;
    /*BASE*/
    float ANCHO_BASE = ANCHO_TORSO;
    float ALTURA_BASE = (float) (ALTURA_TORSO / 4.0);
    /*PIERNA*/
    float ALTURA_PIERNA_SUPERIOR = ALTURA_BRAZO_INFERIOR;
    float TAMANHO_ARTICULACION_PIERNA_SUPERIOR = TAMANHO_ARTICULACION_BRAZO_SUPERIOR;
    float ANCHO_PIERNA_SUPERIOR = (float) (TAMANHO_ARTICULACION_PIERNA_SUPERIOR * 2.0);
    float ALTURA_PIERNA_INFERIOR = ALTURA_PIERNA_SUPERIOR;
    float ANCHO_PIERNA_INFERIOR = ANCHO_PIERNA_SUPERIOR;
    float ANCHO_PIE = ANCHO_PIERNA_INFERIOR;
    float TAMANHO_ARTICULACION_PIERNA_INFERIOR = TAMANHO_ARTICULACION_PIERNA_SUPERIOR;
    /*PIES*/
    float TAMANHO_ARTICULACION_PIE = TAMANHO_ARTICULACION_CABEZA;
    float ALTURA_PIE = (float) (TAMANHO_ARTICULACION_PIE * 2.0);
    float FOOT = (float) (ANCHO_PIE * 2.0);
    float ALTURA_PIERNA = ALTURA_PIERNA_SUPERIOR + ALTURA_PIERNA_INFERIOR + ALTURA_PIE + 2 * (TAMANHO_ARTICULACION_PIE + TAMANHO_ARTICULACION_PIERNA_SUPERIOR + TAMANHO_ARTICULACION_PIERNA_INFERIOR);
    public float avance_suelo = 0;

    public float getAvance() {
        return avance_suelo;
    }

    public void addAvance(float f) {
        avance_suelo += f;
    }
//define PI
    float PI = (float) 3.1415;
//define frames
    int FRAMES = 20;
//definiendo constastes a usar
    int SOLID = 1;
    int WIRE = 2;
    int LEFT = 0;
    int RIGHT = 1;
    float[][] angulos_caminado = new float[2][6];
    float movimiento_base;
    float langle_count;
    float langle_count2;
    float rangle_count;
    float rangle_count2;
    float zoom;
    int zoom_flag;
    int rotate_flag;
    int rotate;
//objeto gl utilizado para funciones opengl
    private GL gl;
//objeto glut
    GLUT glut;
//arreglo con la posicion de la vista
    public float[] vista = new float[3];
    int frames = FRAMES, zoom_fl = 0, flag = 1;

    public Modelo(GLAutoDrawable drawable) {
        gl = drawable.getGL();
        glut = new GLUT();
    }

//================= Movimiento_base(frame) ======================
    public float mostrar_movimiento_base(float langle_up, float langle_lo, float rangle_up, float rangle_lo) {

        float resultado1, resultado2, primer_resultado, segundo_resultado, radianes_superior, radianes_inferior;

        radianes_superior = (PI * langle_up) / 180.0f;
        radianes_inferior = (PI * langle_lo - langle_up) / 180.0f;
        resultado1 = (ALTURA_PIERNA_SUPERIOR + 2.0f * TAMANHO_ARTICULACION_PIERNA_SUPERIOR) * (float) Math.cos(radianes_superior);
        resultado2 = (ALTURA_PIERNA_INFERIOR + 2.0f * (TAMANHO_ARTICULACION_PIERNA_INFERIOR + TAMANHO_ARTICULACION_PIE) + ALTURA_PIE) * (float) Math.cos(radianes_inferior);
        primer_resultado = ALTURA_PIERNA - (resultado1 + resultado2);

        radianes_superior = (PI * rangle_up) / 180.0f;
        radianes_inferior = (PI * rangle_lo - rangle_up) / 180.0f;
        resultado1 = (ALTURA_PIERNA_SUPERIOR + 2 * TAMANHO_ARTICULACION_PIERNA_SUPERIOR) * (float) Math.cos(radianes_superior);
        resultado2 = (ALTURA_PIERNA_INFERIOR + 2 * (TAMANHO_ARTICULACION_PIERNA_INFERIOR + TAMANHO_ARTICULACION_PIE) + ALTURA_PIE) * (float) Math.cos(radianes_inferior);
        segundo_resultado = ALTURA_PIERNA - (resultado1 + resultado2);

        if (primer_resultado <= segundo_resultado) {
            return (-primer_resultado);
        } else {
            return (-segundo_resultado);
        }
    }

//================= Movimiento animado ======================
    public void animar_base() {

        float l_upleg_dif, r_upleg_dif, l_upleg_add, r_upleg_add, l_loleg_dif, r_loleg_dif, l_loleg_add, r_loleg_add;


        avance_suelo += 1;
        //gl.glPushMatrix();
        gl.glBegin(GL.GL_QUADS);
        gl.glVertex3f(-10f + avance_suelo, -2.f, 10.0f);
        gl.glVertex3f(10.0f + avance_suelo, -2.f, 10.0f);
        gl.glVertex3f(10.0f + avance_suelo, -2.f, -10.0f);
        gl.glVertex3f(-10.0f, -2.f, -10.0f);
        gl.glEnd();
        //gl.glPopMatrix();

        switch (flag) {
            case 1:
                l_upleg_dif = 15;
                r_upleg_dif = 5;
                l_loleg_dif = 15;
                r_loleg_dif = 5;

                l_upleg_add = l_upleg_dif / FRAMES;
                r_upleg_add = r_upleg_dif / FRAMES;
                l_loleg_add = l_loleg_dif / FRAMES;
                r_loleg_add = r_loleg_dif / FRAMES;

                angulos_caminado[0][3] += r_upleg_add;
                angulos_caminado[1][3] += l_upleg_add;
                angulos_caminado[0][4] += r_loleg_add;
                angulos_caminado[1][4] += l_loleg_add;

                langle_count -= l_upleg_add;
                langle_count2 -= l_loleg_add;
                rangle_count -= r_upleg_add;
                rangle_count2 -= r_loleg_add;
                movimiento_base = mostrar_movimiento_base(langle_count, langle_count2, rangle_count, rangle_count2);
                frames--;
                if (frames == 0) {
                    flag = 2;
                    frames = FRAMES;
                }
                break;
            case 2:
                l_upleg_dif = 20;
                r_upleg_dif = -65;
                l_loleg_dif = -15;
                r_loleg_dif = 85;

                l_upleg_add = l_upleg_dif / FRAMES;
                r_upleg_add = r_upleg_dif / FRAMES;
                l_loleg_add = l_loleg_dif / FRAMES;
                r_loleg_add = r_loleg_dif / FRAMES;

                angulos_caminado[0][3] += r_upleg_add;
                angulos_caminado[1][3] += l_upleg_add;
                angulos_caminado[0][4] += r_loleg_add;
                angulos_caminado[1][4] += l_loleg_add;

                langle_count -= l_upleg_add;
                langle_count2 -= l_loleg_add;
                rangle_count -= r_upleg_add;
                rangle_count2 -= r_loleg_add;
                movimiento_base = mostrar_movimiento_base(langle_count, langle_count2, rangle_count, rangle_count2);
                frames--;
                if (frames == 0) {
                    flag = 3;
                    frames = FRAMES;
                }
                break;
            case 3:
                l_upleg_dif = 5;
                r_upleg_dif = -25;
                l_loleg_dif = 10;
                r_loleg_dif = -40;

                l_upleg_add = l_upleg_dif / FRAMES;
                r_upleg_add = r_upleg_dif / FRAMES;
                l_loleg_add = l_loleg_dif / FRAMES;
                r_loleg_add = r_loleg_dif / FRAMES;

                angulos_caminado[0][3] += r_upleg_add;
                angulos_caminado[1][3] += l_upleg_add;
                angulos_caminado[0][4] += r_loleg_add;
                angulos_caminado[1][4] += l_loleg_add;

                langle_count -= l_upleg_add;
                langle_count2 -= l_loleg_add;
                rangle_count -= r_upleg_add;
                rangle_count2 -= r_loleg_add;
                movimiento_base = mostrar_movimiento_base(langle_count, langle_count2, rangle_count, rangle_count2);
                frames--;
                if (frames == 0) {
                    flag = 4;
                    frames = FRAMES;
                }
                break;
            case 4:
                l_upleg_dif = 20;
                r_upleg_dif = 25;
                l_loleg_dif = -10;
                r_loleg_dif = -50;

                l_upleg_add = l_upleg_dif / FRAMES;
                r_upleg_add = r_upleg_dif / FRAMES;
                l_loleg_add = l_loleg_dif / FRAMES;
                r_loleg_add = r_loleg_dif / FRAMES;

                angulos_caminado[0][3] += r_upleg_add;
                angulos_caminado[1][3] += l_upleg_add;
                angulos_caminado[0][4] += r_loleg_add;
                angulos_caminado[1][4] += l_loleg_add;

                langle_count -= l_upleg_add;
                langle_count2 -= l_loleg_add;
                rangle_count -= r_upleg_add;
                rangle_count2 -= r_loleg_add;
                movimiento_base = mostrar_movimiento_base(langle_count, langle_count2, rangle_count, rangle_count2);
                frames--;
                if (frames == 0) {
                    flag = 5;
                    frames = FRAMES;
                }
                break;
            case 5:
                l_upleg_dif = 5;
                r_upleg_dif = 15;
                l_loleg_dif = 5;
                r_loleg_dif = 15;

                l_upleg_add = l_upleg_dif / FRAMES;
                r_upleg_add = r_upleg_dif / FRAMES;
                l_loleg_add = l_loleg_dif / FRAMES;
                r_loleg_add = r_loleg_dif / FRAMES;

                angulos_caminado[0][3] += r_upleg_add;
                angulos_caminado[1][3] += l_upleg_add;
                angulos_caminado[0][4] += r_loleg_add;
                angulos_caminado[1][4] += l_loleg_add;

                langle_count += r_upleg_add;
                langle_count2 += r_loleg_add;
                rangle_count -= r_upleg_add;
                rangle_count2 -= r_loleg_add;
                movimiento_base = mostrar_movimiento_base(langle_count, langle_count2, rangle_count, rangle_count2);
                frames--;
                if (frames == 0) {
                    flag = 6;
                    frames = FRAMES;
                }
                break;
            case 6:
                l_upleg_dif = -65;
                r_upleg_dif = 20;
                l_loleg_dif = 85;
                r_loleg_dif = -15;

                l_upleg_add = l_upleg_dif / FRAMES;
                r_upleg_add = r_upleg_dif / FRAMES;
                l_loleg_add = l_loleg_dif / FRAMES;
                r_loleg_add = r_loleg_dif / FRAMES;

                angulos_caminado[0][3] += r_upleg_add;
                angulos_caminado[1][3] += l_upleg_add;
                angulos_caminado[0][4] += r_loleg_add;
                angulos_caminado[1][4] += l_loleg_add;

                langle_count += r_upleg_add;
                langle_count2 += r_loleg_add;
                rangle_count -= r_upleg_add;
                rangle_count2 -= r_loleg_add;
                movimiento_base = mostrar_movimiento_base(langle_count, langle_count2, rangle_count, rangle_count2);
                frames--;
                if (frames == 0) {
                    flag = 7;
                    frames = FRAMES;
                }
                break;
            case 7:
                l_upleg_dif = -25;
                r_upleg_dif = 5;
                l_loleg_dif = -40;
                r_loleg_dif = 10;

                l_upleg_add = l_upleg_dif / FRAMES;
                r_upleg_add = r_upleg_dif / FRAMES;
                l_loleg_add = l_loleg_dif / FRAMES;
                r_loleg_add = r_loleg_dif / FRAMES;

                angulos_caminado[0][3] += r_upleg_add;
                angulos_caminado[1][3] += l_upleg_add;
                angulos_caminado[0][4] += r_loleg_add;
                angulos_caminado[1][4] += l_loleg_add;

                langle_count += r_upleg_add;
                langle_count2 += r_loleg_add;
                rangle_count -= r_upleg_add;
                rangle_count2 -= r_loleg_add;
                movimiento_base = mostrar_movimiento_base(langle_count, langle_count2, rangle_count, rangle_count2);
                frames--;
                if (frames == 0) {
                    flag = 8;
                    frames = FRAMES;
                }
                break;
            case 8:
                l_upleg_dif = 25;
                r_upleg_dif = 20;
                l_loleg_dif = -50;
                r_loleg_dif = -10;

                l_upleg_add = l_upleg_dif / FRAMES;
                r_upleg_add = r_upleg_dif / FRAMES;
                l_loleg_add = l_loleg_dif / FRAMES;
                r_loleg_add = r_loleg_dif / FRAMES;

                angulos_caminado[0][3] += r_upleg_add;
                angulos_caminado[1][3] += l_upleg_add;
                angulos_caminado[0][4] += r_loleg_add;
                angulos_caminado[1][4] += l_loleg_add;

                langle_count += r_upleg_add;
                langle_count2 += r_loleg_add;
                rangle_count -= r_upleg_add;
                rangle_count2 -= r_loleg_add;
                movimiento_base = mostrar_movimiento_base(langle_count, langle_count2, rangle_count, rangle_count2);
                frames--;
                if (frames == 0) {
                    flag = 9;
                    frames = FRAMES;
                }
                break;


            case 9:
                l_upleg_dif = 5;
                r_upleg_dif = 15;
                l_loleg_dif = 5;
                r_loleg_dif = 15;

                l_upleg_add = l_upleg_dif / FRAMES;
                r_upleg_add = r_upleg_dif / FRAMES;
                l_loleg_add = l_loleg_dif / FRAMES;
                r_loleg_add = r_loleg_dif / FRAMES;

                angulos_caminado[0][3] += r_upleg_add;
                angulos_caminado[1][3] += l_upleg_add;
                angulos_caminado[0][4] += r_loleg_add;
                angulos_caminado[1][4] += l_loleg_add;

                langle_count -= l_upleg_add;
                langle_count2 -= l_loleg_add;
                rangle_count -= r_upleg_add;
                rangle_count2 -= r_loleg_add;
                movimiento_base = mostrar_movimiento_base(langle_count, langle_count2, rangle_count, rangle_count2);
                frames--;
                if (frames == 0) {
                    flag = 10;
                    frames = FRAMES;
                }
                break;
            case 10:
                l_upleg_dif = -65;
                r_upleg_dif = 20;
                l_loleg_dif = 85;
                r_loleg_dif = -15;

                l_upleg_add = l_upleg_dif / FRAMES;
                r_upleg_add = r_upleg_dif / FRAMES;
                l_loleg_add = l_loleg_dif / FRAMES;
                r_loleg_add = r_loleg_dif / FRAMES;

                angulos_caminado[0][3] += r_upleg_add;
                angulos_caminado[1][3] += l_upleg_add;
                angulos_caminado[0][4] += r_loleg_add;
                angulos_caminado[1][4] += l_loleg_add;

                langle_count -= l_upleg_add;
                langle_count2 -= l_loleg_add;
                rangle_count -= r_upleg_add;
                rangle_count2 -= r_loleg_add;
                movimiento_base = mostrar_movimiento_base(langle_count, langle_count2, rangle_count, rangle_count2);
                frames--;
                if (frames == 0) {
                    flag = 11;
                    frames = FRAMES;
                }
                break;
            case 11:
                l_upleg_dif = -25;
                r_upleg_dif = 5;
                l_loleg_dif = -40;
                r_loleg_dif = 10;

                l_upleg_add = l_upleg_dif / FRAMES;
                r_upleg_add = r_upleg_dif / FRAMES;
                l_loleg_add = l_loleg_dif / FRAMES;
                r_loleg_add = r_loleg_dif / FRAMES;

                angulos_caminado[0][3] += r_upleg_add;
                angulos_caminado[1][3] += l_upleg_add;
                angulos_caminado[0][4] += r_loleg_add;
                angulos_caminado[1][4] += l_loleg_add;

                langle_count -= l_upleg_add;
                langle_count2 -= l_loleg_add;
                rangle_count -= r_upleg_add;
                rangle_count2 -= r_loleg_add;
                movimiento_base = mostrar_movimiento_base(langle_count, langle_count2, rangle_count, rangle_count2);
                frames--;
                if (frames == 0) {
                    flag = 12;
                    frames = FRAMES;
                }
                break;
            case 12:
                l_upleg_dif = 25;
                r_upleg_dif = 20;
                l_loleg_dif = -50;
                r_loleg_dif = -10;

                l_upleg_add = l_upleg_dif / FRAMES;
                r_upleg_add = r_upleg_dif / FRAMES;
                l_loleg_add = l_loleg_dif / FRAMES;
                r_loleg_add = r_loleg_dif / FRAMES;

                angulos_caminado[0][3] += r_upleg_add;
                angulos_caminado[1][3] += l_upleg_add;
                angulos_caminado[0][4] += r_loleg_add;
                angulos_caminado[1][4] += l_loleg_add;

                langle_count -= l_upleg_add;
                langle_count2 -= l_loleg_add;
                rangle_count -= r_upleg_add;
                rangle_count2 -= r_loleg_add;
                movimiento_base = mostrar_movimiento_base(langle_count, langle_count2, rangle_count, rangle_count2);
                frames--;
                if (frames == 0) {
                    flag = 13;
                    frames = FRAMES;
                }
                break;
            case 13:
                l_upleg_dif = 15;
                r_upleg_dif = 5;
                l_loleg_dif = 15;
                r_loleg_dif = 5;

                l_upleg_add = l_upleg_dif / FRAMES;
                r_upleg_add = r_upleg_dif / FRAMES;
                l_loleg_add = l_loleg_dif / FRAMES;
                r_loleg_add = r_loleg_dif / FRAMES;

                angulos_caminado[0][3] += r_upleg_add;
                angulos_caminado[1][3] += l_upleg_add;
                angulos_caminado[0][4] += r_loleg_add;
                angulos_caminado[1][4] += l_loleg_add;

                langle_count += r_upleg_add;
                langle_count2 += r_loleg_add;
                rangle_count -= r_upleg_add;
                rangle_count2 -= r_loleg_add;
                movimiento_base = mostrar_movimiento_base(langle_count, langle_count2, rangle_count, rangle_count2);
                frames--;
                if (frames == 0) {
                    flag = 14;
                    frames = FRAMES;
                }
                break;
            case 14:
                l_upleg_dif = 20;
                r_upleg_dif = -65;
                l_loleg_dif = -15;
                r_loleg_dif = 85;

                l_upleg_add = l_upleg_dif / FRAMES;
                r_upleg_add = r_upleg_dif / FRAMES;
                l_loleg_add = l_loleg_dif / FRAMES;
                r_loleg_add = r_loleg_dif / FRAMES;

                angulos_caminado[0][3] += r_upleg_add;
                angulos_caminado[1][3] += l_upleg_add;
                angulos_caminado[0][4] += r_loleg_add;
                angulos_caminado[1][4] += l_loleg_add;

                langle_count += r_upleg_add;
                langle_count2 += r_loleg_add;
                rangle_count -= r_upleg_add;
                rangle_count2 -= r_loleg_add;
                movimiento_base = mostrar_movimiento_base(langle_count, langle_count2, rangle_count, rangle_count2);
                frames--;
                if (frames == 0) {
                    flag = 15;
                    frames = FRAMES;
                }
                break;

            case 15:
                l_upleg_dif = 5;
                r_upleg_dif = -25;
                l_loleg_dif = 10;
                r_loleg_dif = -40;

                l_upleg_add = l_upleg_dif / FRAMES;
                r_upleg_add = r_upleg_dif / FRAMES;
                l_loleg_add = l_loleg_dif / FRAMES;
                r_loleg_add = r_loleg_dif / FRAMES;

                angulos_caminado[0][3] += r_upleg_add;
                angulos_caminado[1][3] += l_upleg_add;
                angulos_caminado[0][4] += r_loleg_add;
                angulos_caminado[1][4] += l_loleg_add;

                langle_count += r_upleg_add;
                langle_count2 += r_loleg_add;
                rangle_count -= r_upleg_add;
                rangle_count2 -= r_loleg_add;
                movimiento_base = mostrar_movimiento_base(langle_count, langle_count2, rangle_count, rangle_count2);
                frames--;
                if (frames == 0) {
                    flag = 16;
                    frames = FRAMES;
                }
                break;
            case 16:
                l_upleg_dif = 20;
                r_upleg_dif = 25;
                l_loleg_dif = -10;
                r_loleg_dif = -50;

                l_upleg_add = l_upleg_dif / FRAMES;
                r_upleg_add = r_upleg_dif / FRAMES;
                l_loleg_add = l_loleg_dif / FRAMES;
                r_loleg_add = r_loleg_dif / FRAMES;

                angulos_caminado[0][3] += r_upleg_add;
                angulos_caminado[1][3] += l_upleg_add;
                angulos_caminado[0][4] += r_loleg_add;
                angulos_caminado[1][4] += l_loleg_add;

                langle_count += r_upleg_add;
                langle_count2 += r_loleg_add;
                rangle_count -= r_upleg_add;
                rangle_count2 -= r_loleg_add;
                movimiento_base = mostrar_movimiento_base(langle_count, langle_count2, rangle_count, rangle_count2);
                frames--;
                if (frames == 0) {
                    flag = 1;
                    frames = FRAMES;
                }
                break;


            default:
                break;
        }

        if (zoom_flag != 0) {
            switch (zoom_fl) {
                case 0:
                    zoom += 0.05;
                    if (zoom > 2.5) {
                        zoom_fl = 1;
                    }
                    break;
                case 1:
                    zoom -= 0.05;
                    if (zoom < -2.5) {
                        zoom_fl = 0;
                    }
                    break;
                default:
                    break;
            }
        }

        if (rotate_flag != 0) {
            rotate = (rotate + 1) % 360;
        }
        //glut.glutPostRedisplay() ;

    }

//================= Cuerpo(frame) ======================
    public void Dibuja_Cuerpo(int frame) {
        gl.glPushMatrix();
        gl.glTranslatef(0.0f, movimiento_base, 0.0f);
        gl.glPushMatrix();
        gl.glTranslatef(0.0f, ALTURA_BASE * 2.5f, 0.0f);
        Dibujar_Torso(frame);
        //gl.glPopMatrix() ;
        gl.glPushMatrix();
        gl.glTranslatef(0.0f, ALTURA_BASE * 2.2f, 0.0f);
        vista[0] = movimiento_base + ALTURA_BASE * 2.2f + ALTURA_BASE * 2.5f + ALTURA_CABEZA * 0.75f;
        Dibujar_Cabeza(frame);
        gl.glPopMatrix();
        gl.glPushMatrix();
        gl.glTranslatef(ANCHO_TORSO * 0.7f, ALTURA_BASE * 2.2f, 0.0f);
        Dibujar_Brazo(LEFT, frame);
        gl.glPopMatrix();
        gl.glPushMatrix();
        gl.glTranslatef(-ANCHO_TORSO * 0.7f, ALTURA_BASE * 2.2f, 0.0f);
        Dibujar_Brazo(RIGHT, frame);
        gl.glPopMatrix();
        gl.glPopMatrix();
        Dibuja_Base(frame);
        gl.glTranslatef(0.0f, -(ALTURA_BASE), 0.0f);
        gl.glPushMatrix();
        gl.glTranslatef(ANCHO_TORSO * 0.33f, 0.0f, 0.0f);
        Dibuja_Pierna(LEFT, frame);
        gl.glPopMatrix();
        gl.glTranslatef(-ANCHO_TORSO * 0.33f, 0.0f, 0.0f);
        Dibuja_Pierna(RIGHT, frame);
        gl.glPopMatrix();
    }
//================= Torso(frame) ======================

    public void Dibujar_Torso(int frame) {
        gl.glPushMatrix();
        gl.glScalef(ANCHO_TORSO, ALTURA_TORSO, TORSO);
        gl.glColor3f(0.0f, 1.0f, 1.0f);
        if (frame == WIRE) {
            glut.glutWireCube(1.0f);
        } else {
            glut.glutSolidCube(1.0f);
        }
        gl.glPopMatrix();

    }

    public void Dibujar_Cabeza(int frame) {

        gl.glPushMatrix();
        gl.glScalef(TAMANHO_ARTICULACION_CABEZA, TAMANHO_ARTICULACION_CABEZA, TAMANHO_ARTICULACION_CABEZA);
        gl.glColor3f(0.0f, 1.0f, 0.0f);
        if (frame == WIRE) {
            glut.glutWireSphere(1.0, 8, 8);
        } else {
            glut.glutSolidSphere(1.0, 8, 8);
        }
        gl.glPopMatrix();
        gl.glColor3f(0.0f, 0.0f, 1.0f);
        gl.glTranslatef(0.0f, ALTURA_CABEZA, 0.0f);
        gl.glPushMatrix();
        gl.glScalef(ALTURA_CABEZA, ALTURA_CABEZA, ALTURA_CABEZA);
        gl.glColor3f(0.0f, 1.0f, 0.0f);
        if (frame == WIRE) {
            glut.glutWireSphere(1.0, 8, 8);
        } else {
            glut.glutSolidSphere(1.0, 8, 8);
        }
        gl.glPopMatrix();
    }
//================= Base(frame) ======================

    public void Dibuja_Base(int frame) {
        gl.glPushMatrix();
        gl.glScalef(ANCHO_BASE, ALTURA_BASE, TORSO);
        gl.glColor3f(0.0f, 1.0f, 1.0f);
        if (frame == WIRE) {
            glut.glutWireCube(1.0f);
        } else {
            glut.glutSolidCube(1.0f);
        }
        gl.glPopMatrix();
    }

    public void Dibuja_Pierna_Superior(int frame) {
        gl.glPushMatrix();
        gl.glScalef(TAMANHO_ARTICULACION_PIERNA_SUPERIOR, TAMANHO_ARTICULACION_PIERNA_SUPERIOR, TAMANHO_ARTICULACION_PIERNA_SUPERIOR);
        gl.glColor3f(0.0f, 1.0f, 0.0f);
        if (frame == WIRE) {
            glut.glutWireSphere(1.0, 8, 8);
        } else {
            glut.glutSolidSphere(1.0, 8, 8);
        }
        gl.glPopMatrix();
        gl.glColor3f(0.0f, 0.0f, 1.0f);
        gl.glTranslatef(0.0f, -ALTURA_PIERNA_SUPERIOR * 0.75f, 0.0f);
        gl.glPushMatrix();
        gl.glScalef(ANCHO_PIERNA_SUPERIOR, ALTURA_PIERNA_SUPERIOR, ANCHO_PIERNA_SUPERIOR);
        if (frame == WIRE) {
            glut.glutWireCube(1.0f);
        } else {
            glut.glutSolidCube(1.0f);
        }
        gl.glPopMatrix();
    }

    public void Dibuja_Pierna_Inferior(int frame) {
        gl.glPushMatrix();
        gl.glScalef(TAMANHO_ARTICULACION_PIERNA_INFERIOR, TAMANHO_ARTICULACION_PIERNA_INFERIOR, TAMANHO_ARTICULACION_PIERNA_INFERIOR);
        gl.glColor3f(0.0f, 1.0f, 0.0f);
        if (frame == WIRE) {
            glut.glutWireSphere(1.0, 8, 8);
        } else {
            glut.glutSolidSphere(1.0, 8, 8);
        }
        gl.glPopMatrix();
        gl.glTranslatef(0.0f, -ALTURA_PIERNA_INFERIOR * 0.75f, 0.0f);
        gl.glPushMatrix();
        gl.glScalef(ANCHO_PIERNA_INFERIOR, ALTURA_PIERNA_INFERIOR, ANCHO_PIERNA_INFERIOR);
        gl.glColor3f(0.0f, 0.0f, 1.0f);
        if (frame == WIRE) {
            glut.glutWireCube(1.0f);
        } else {
            glut.glutSolidCube(1.0f);
        }
        gl.glPopMatrix();
    }

    public void Dibuja_Pie(int frame) {
        gl.glPushMatrix();
        gl.glScalef(TAMANHO_ARTICULACION_PIE, TAMANHO_ARTICULACION_PIE, TAMANHO_ARTICULACION_PIE);
        gl.glColor3f(0.0f, 1.0f, 0.0f);
        if (frame == WIRE) {
            glut.glutWireCube(1.0f);
        } else {
            glut.glutSolidCube(1.0f);
        }
        gl.glPopMatrix();
        gl.glTranslatef(0.0f, -TAMANHO_ARTICULACION_PIE * 2.0f, ANCHO_PIE * 0.5f);
        gl.glPushMatrix();
        gl.glScalef(ANCHO_PIE, ALTURA_PIE, FOOT);
        gl.glColor3f(0.0f, 0.0f, 1.0f);
        if (frame == WIRE) {
            glut.glutWireCube(1.0f);
        } else {
            glut.glutSolidCube(1.0f);
        }
        gl.glPopMatrix();
    }

    public void Dibuja_Pierna(int side, int frame) {
        gl.glPushMatrix();
        gl.glRotatef(angulos_caminado[side][3], 1.0f, 0.0f, 0.0f);
        Dibuja_Pierna_Superior(frame);
        gl.glTranslatef(0.0f, -ALTURA_PIERNA_SUPERIOR * 0.75f, 0.0f);
        gl.glRotatef(angulos_caminado[side][4], 1.0f, 0.0f, 0.0f);
        Dibuja_Pierna_Inferior(frame);
        gl.glTranslatef(0.0f, -ALTURA_PIERNA_INFERIOR * 0.625f, 0.0f);
        gl.glRotatef(angulos_caminado[side][5], 1.0f, 0.0f, 0.0f);
        Dibuja_Pie(frame);
        gl.glPopMatrix();
    }

    public void Dibujar_Brazo(int side, int frame) {
        gl.glPushMatrix();
        gl.glRotatef(angulos_caminado[side][0], 1.0f, 0.0f, 0.0f);
        Dibujar_Brazo_Superior(frame);
        gl.glTranslatef(0.0f, -ALTURA_BRAZO_SUPERIOR * 0.75f, 0.0f);
        gl.glRotatef(angulos_caminado[side][1], 1.0f, 0.0f, 0.0f);
        Dibujar_Brazo_Inferior(frame);
        gl.glTranslatef(0.0f, -ALTURA_BRAZO_INFERIOR * 0.625f, 0.0f);
        gl.glRotatef(angulos_caminado[side][2], 1.0f, 0.0f, 0.0f);
        Dibujar_Mano(frame);
        gl.glPopMatrix();
    }

    public void Dibujar_Brazo_Superior(int frame) {
        gl.glPushMatrix();
        gl.glScalef(TAMANHO_ARTICULACION_BRAZO_SUPERIOR, TAMANHO_ARTICULACION_BRAZO_SUPERIOR, TAMANHO_ARTICULACION_BRAZO_SUPERIOR);
        gl.glColor3f(0.0f, 1.0f, 0.0f);
        if (frame == WIRE) {
            glut.glutWireSphere(1.0, 8, 8);
        } else {
            glut.glutSolidSphere(1.0, 8, 8);
        }
        gl.glPopMatrix();
        gl.glColor3f(0.0f, 0.0f, 1.0f);
        gl.glTranslatef(0.0f, -ALTURA_BRAZO_SUPERIOR * 0.75f, 0.0f);
        gl.glPushMatrix();
        gl.glScalef(ANCHO_BRAZO_SUPERIOR, ALTURA_BRAZO_SUPERIOR, ANCHO_BRAZO_SUPERIOR);
        if (frame == WIRE) {
            glut.glutWireCube(1.0f);
        } else {
            glut.glutSolidCube(1.0f);
        }
        gl.glPopMatrix();
    }

    public void Dibujar_Brazo_Inferior(int frame) {
        gl.glPushMatrix();
        gl.glScalef(TAMANHO_ARTICULACION_BRAZO_INFERIOR, TAMANHO_ARTICULACION_BRAZO_INFERIOR, TAMANHO_ARTICULACION_BRAZO_INFERIOR);
        gl.glColor3f(0.0f, 1.0f, 0.0f);
        if (frame == WIRE) {
            glut.glutWireSphere(1.0, 8, 8);
        } else {
            glut.glutSolidSphere(1.0, 8, 8);
        }
        gl.glPopMatrix();
        gl.glTranslatef(0.0f, -ALTURA_BRAZO_INFERIOR * 0.75f, 0.0f);
        gl.glPushMatrix();
        gl.glScalef(ANCHO_BRAZO_INFERIOR, ALTURA_BRAZO_INFERIOR, ANCHO_BRAZO_INFERIOR);
        gl.glColor3f(0.0f, 0.0f, 1.0f);
        if (frame == WIRE) {
            glut.glutWireCube(1.0f);
        } else {
            glut.glutSolidCube(1.0f);
        }
        gl.glPopMatrix();
    }

    public void Dibujar_Mano(int frame) {
        gl.glPushMatrix();
        gl.glScalef(ANCHO_MANO, ALTURA_MANO, MANO);
        gl.glColor3f(0.0f, 0.0f, 1.0f);
        if (frame == WIRE) {
            glut.glutWireCube(1.0f);
        } else {
            glut.glutSolidCube(1.0f);
        }
        gl.glPopMatrix();
    }
}
